package com.springspirit.monitor;

import java.io.IOException;
import java.util.Date;
import java.util.Queue;
import java.util.Random;
import java.util.concurrent.ConcurrentLinkedQueue;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.servlet.AsyncContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.codehaus.jettison.json.JSONArray;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * 
 * Event Publishing을 처리한다.
 * 
 * @author greatshin
 *
 */
@Controller
public class EventPublisher {
	
//	private static final Logger logger = LoggerFactory.getLogger(EventPublisher.class);
//	
//	private final Queue<AsyncContext> asyncContexts = new ConcurrentLinkedQueue<AsyncContext>();
//
//	private final Random random = new Random();
//	
//	private final Thread generator = new Thread("Event generator") {
//		@Override
//		public void run() {
//			
//			if(logger.isDebugEnabled()){
//				logger.debug("EventPublisher generator running...");
//			}
//			
//			while (!Thread.currentThread().isInterrupted()) {
//				try {
//					Thread.sleep(random.nextInt(3000));
//					while (!asyncContexts.isEmpty()) {
//						AsyncContext asyncContext = asyncContexts.poll();
//						HttpServletResponse peer = (HttpServletResponse) asyncContext.getResponse();
//
//						JSONArray jSONArray = new JSONArray().put("At " + new Date());
//
//						if(logger.isDebugEnabled())
//						{
//							System.out.println(jSONArray.toString());
//						}
//
//						peer.getWriter().write(jSONArray.toString());
//						peer.setStatus(HttpServletResponse.SC_OK);
//						peer.setContentType("application/json");
//						asyncContext.complete();
//					}
//				} catch (InterruptedException e) {
//					Thread.currentThread().interrupt();
//				} catch (IOException e) {
//					throw new RuntimeException(e.getMessage(), e);
//				}
//			}
//		}
//	};
//	
//	/**
//	 * CEP 엔진으로부터 수집된 서버 로그를 AsyncContext를 이용하여 리턴한다.
//	 */
//	@RequestMapping("/publishEvent.do")
//	public String publishEvent(HttpServletRequest req) {
//		AsyncContext asyncContext = req.startAsync();
//		
//		asyncContext.setTimeout(0);
//		
//		if(logger.isDebugEnabled()){
//			logger.debug("An AsyncContext Queued...");
//		}
//		
//		asyncContexts.offer(asyncContext);
//		
//		return "event";
//	}
//	
//	@PostConstruct
//	public void init() {
//		
//		if(logger.isDebugEnabled()){
//			logger.debug("EventPublisher initialized...");
//		}
//		
//		generator.start();
//	}
//
//	@PreDestroy
//	public void destroy() {
//		
//		if(logger.isDebugEnabled()){
//			logger.debug("EventPublisher destroyed...");
//		}
//		generator.interrupt();
//	}
}
